{{#jackson}}
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
{{/jackson}}

/**
 * {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{description}}{{/description}}
 */
{{#additionalEnumTypeAnnotations}}
{{{.}}}
{{/additionalEnumTypeAnnotations}}{{#useBeanValidation}}@Introspected
{{/useBeanValidation}}public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} {
    {{#allowableValues}}
        {{#enumVars}}
            {{#enumDescription}}
    /**
     * {{enumDescription}}
     */
            {{/enumDescription}}
            {{#withXml}}
    @XmlEnumValue({{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}}{{{value}}}{{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}})
            {{/withXml}}
    {{{name}}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}}
        {{/enumVars}}
    {{/allowableValues}}

    private {{{dataType}}} value;

    {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}({{{dataType}}} value) {
        this.value = value;
    }

    {{#jackson}}
    @JsonValue
    {{/jackson}}
    public {{{dataType}}} getValue() {
        return value;
    }

    @Override
    public String toString() {
        return String.valueOf(value);
    }

    {{#jackson}}
    @JsonCreator
    {{/jackson}}
    public static {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue({{{dataType}}} value) {
        for ({{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
            if (b.value.{{^isString}}equals{{/isString}}{{#isString}}{{#useEnumCaseInsensitive}}equalsIgnoreCase{{/useEnumCaseInsensitive}}{{^useEnumCaseInsensitive}}equals{{/useEnumCaseInsensitive}}{{/isString}}(value)) {
                return b;
            }
        }
    {{#isNullable}}
        return null;
    {{/isNullable}}
    {{^isNullable}}
        throw new IllegalArgumentException("Unexpected value '" + value + "'");
    {{/isNullable}}
    }
}
